import os
from src.utils.logger import log_error, log_info
from src.utils.util import Util


class SRTProcessor:
    def __init__(self, srt_path):
        self.srt_path = srt_path

    def judge_advertisement_with_openai(self):
        """
        判断视频中是否存在广告
        使用Agent模式提高检测准确性
        :param srt_path: 字幕文件路径
        :return: 广告商品名称，或者 "None"（如果不存在广告）
        """
        srt_path = self.srt_path
        try:

            # 执行检测
            result = self.detect_from_srt()

            # 记录最终结果
            if result == "None":
                log_info(f"广告检测最终结果: 未检测到广告")
            else:
                log_info(f"广告检测最终结果: 检测到广告商品 - {result}")

            return result

        except Exception as e:
            log_info(f"调用广告检测时出错: {e}")
            log_error(f"广告检测错误: {e}")
            return "None"  # 出错时默认返回None
        finally:
            # 确保无论如何都删除临时字幕文件
            try:
                if os.path.exists(srt_path):
                    os.remove(srt_path)
                    pass
            except Exception as e:
                log_info(f"删除临时字幕文件时出错: {e}")
                log_error(f"删除临时字幕文件时出错: {e}")

    def detect_from_srt(self):
        """
        从SRT文件检测广告
        :param srt_path: SRT文件路径
        :return: 广告商品名称或 "None"
        """
        srt_path = self.srt_path
        try:
            # 1. 读取SRT内容
            with open(srt_path, "r", encoding="utf-8") as file:
                content = file.read()

            # 2. 初步检查字幕行数
            line_count = content.count('\n')
            if line_count < 20:
                log_info(f"字幕行数少于20行({line_count}行)，视为无内容视频")
                return "None"

            # 3. 进行第一阶段分析 - 广告存在性判断
            has_ad = self._check_ad_existence(content)

            # 4. 如果第一阶段未检测到广告，直接返回None
            if has_ad.lower() in ['no', 'false', 'none', '否', '无', '没有']:
                log_info(f"一阶段分析结果：未检测到广告")
                return "None"

            # 5. 如果检测到广告，进行第二阶段 - 提取商品名称
            product_name = self._extract_product_name(content)

            # 6. 验证最终结果
            return self._validate_result(product_name)

        except Exception as e:
            log_info(f"广告检测过程中出错: {str(e)}")
            log_error(f"广告检测错误")
            # 出错时返回None，避免错误干扰正常流程
            return "None"

    def _check_ad_existence(self, content):
        """
        第一阶段：判断是否存在广告（仅返回是/否）
        :param content: SRT内容
        :return: "Yes"或"No"
        """
        log_info("开始一阶段分析：判断是否存在广告...")

        messages = [
            {"role": "system",
             "content": "你是一个广告识别专家。你的任务是判断视频字幕中是否包含插入式广告。请只回答'Yes'或'No'。"},
            {"role": "user", "content": f"""
分析以下SRT格式的视频字幕，判断是否包含插入式广告：

{content}

插入式广告的定义：在视频中插入与视频主题无关的商品或服务推广内容。

注意：广告通常会突兀地出现，打断视频原有内容流程

你的回答必须只有一个词：Yes（包含广告）或No（不包含广告）。
不要包含任何其他内容、解释或标点符号。
"""}
        ]

        response = Util.get_openai_client().chat.completions.create(
            model="gpt-4-turbo",
            messages=messages,
            temperature=0,
            max_tokens=10,  # 限制回复长度，只需要简短回复
            timeout=60
        )

        result = response.choices[0].message.content.strip()
        log_info(f"一阶段判断结果: {result}")
        return result

    def _extract_product_name(self, content):
        """
        第二阶段：提取具体的广告商品名称
        :param content: SRT内容
        :return: 商品名称
        """
        log_info("开始二阶段分析：提取广告商品名称...")

        messages = [
            {"role": "system",
             "content": "你是一个广告识别专家。你的任务是从视频字幕中提取广告宣传的商品或服务名称。请简洁准确地提供名称，不需要任何解释。"},
            {"role": "user", "content": f"""
从以下SRT格式的视频字幕中，提取其中宣传的商品或服务名称：

{content}

要求：
1. 只提取商品/服务的名称，不要包含任何解释或额外信息
2. 如果有多个广告，只提取最主要的一个
3. 名称应简短精确，不超过5个词
4. 不要使用引号或其他标点符号
5. 如果确实找不到明确的广告商品，请返回"None"

你的回答必须简洁，只包含商品名称或"None"。
"""}
        ]

        response = Util.get_openai_client().chat.completions.create(
            model="gpt-4-turbo",
            messages=messages,
            temperature=0,
            max_tokens=50,  # 限制回复长度，避免冗长解释
            timeout=60
        )

        result = response.choices[0].message.content.strip()
        log_info(f"二阶段提取结果: {result}")
        return result


    def _validate_result(self, result):
        """
        验证并标准化最终结果
        :param result: 原始结果
        :return: 标准化的结果
        """
        # 去除多余字符
        cleaned = result.strip().strip('.。,，!！?？\'\"')

        # 处理None情况
        if cleaned.lower() == 'none' or cleaned.lower() == 'no' or cleaned == '无' or cleaned == '没有':
            return "None"

        # 处理解释性文本 - 如果太长可能是解释而不是商品名
        if len(cleaned.split()) > 6 or len(cleaned) > 40:
            log_info(f"警告：结果过长，可能不是有效的商品名称: {cleaned}")
            words = cleaned.split()
            if len(words) > 0:
                # 尝试提取前几个词作为商品名
                shorter = ' '.join(words[:3])
                log_info(f"截取为更短的商品名: {shorter}")
                return shorter
            return "None"

        # 返回有效的商品名
        return cleaned

